package work.base.designpattern.proxy;

// 定义用户服务接口
interface UserService {
    void createUser(String username);

    void deleteUser(String username);
}

// 目标对象：实际的用户服务实现
class UserServiceImpl implements UserService {
    @Override
    public void createUser(String username) {
        System.out.println("创建用户：" + username);
    }

    @Override
    public void deleteUser(String username) {
        System.out.println("删除用户：" + username);
    }
}

// 代理对象：控制对用户服务的访问
class UserServiceProxy implements UserService {
    private final UserService target;  // 目标对象
    private final String currentUser;  // 当前登录用户

    public UserServiceProxy(UserService target, String currentUser) {
        this.target = target;
        this.currentUser = currentUser;
    }

    @Override
    public void createUser(String username) {
        // 访问控制：只有管理员可以创建用户
        if ("admin".equals(currentUser)) {
            System.out.println("[日志] " + currentUser + " 正在创建用户...");
            target.createUser(username);
            System.out.println("[日志] 用户创建成功");
        } else {
            System.out.println("错误：只有管理员可以创建用户");
        }
    }

    @Override
    public void deleteUser(String username) {
        // 访问控制：只有管理员可以删除用户
        if ("admin".equals(currentUser)) {
            System.out.println("[日志] " + currentUser + " 正在删除用户...");
            target.deleteUser(username);
            System.out.println("[日志] 用户删除成功");
        } else {
            System.out.println("错误：只有管理员可以删除用户");
        }
    }
}

// 测试代码
public class StaticProxyExample {
    public static void main(String[] args) {
        // 创建目标对象
        UserService userService = new UserServiceImpl();

        // 创建代理对象（管理员用户）
        UserService adminProxy = new UserServiceProxy(userService, "admin");
        adminProxy.createUser("testUser");
        adminProxy.deleteUser("testUser");

        System.out.println("-------------------");

        // 创建代理对象（普通用户）
        UserService userProxy = new UserServiceProxy(userService, "普通用户");
        userProxy.createUser("anotherUser");
        userProxy.deleteUser("anotherUser");
    }
}
